﻿using System.Linq;
using System.Web.Mvc;
using cludg.Domain.Content.Stories;
using cludg.Domain.Users;
using cludg.Infrastructure.Core;
using cludg.Infrastructure.Core.Attributes;
using cludg.Services.Content;
using cludg.Web.Core;
using cludg.Web.Core.Controllers;
using cludg.Web.ViewModels;

namespace cludg.Web.Controllers
{
	public class FeedController : BaseController
	{
		[Dependency]
		public IStoryService StoryService { get; set; }

		[Dependency]
		public IOfferService OfferService { get; set; }

		public ActionResult Rss()
		{
			var storiesToFeed = StoryService.All.OrderByDescending(x => x.CreationTime).Take(20);

			var feedModel = CreateFeedModel<MainFeedModel>();
			feedModel.Stories = storiesToFeed;

			return View("MainRss", feedModel);
		}

		/// <summary>
		/// Фид для новых предложений
		/// </summary>
		/// <param name="id">Уникальный ИД фида для каждого пользователя</param>
		/// <returns>RSS поток новых предложений</returns>
		public ActionResult OfferRss(string id)
		{
			// проверим, существует ли поток с указанным ИД. Если нет, просто ничего не возвращаем
			// так же проверим, что владельцем данного потока является пользователь с ролью автор или админ
			var feedSetting = SettingService.All.Where(x => x.Name == Const.SettingNewOffersUniqueFeedId && x.Value.Equals(id)).FirstOrDefault();
			if (feedSetting == null)
				return null;

			// так же проверим, что владельцем данного потока является пользователь с ролью автор или админ
			if (feedSetting.User.Role == UserRole.Author || feedSetting.User.Role == UserRole.Admin)
			{
				var offersToFeed =
					OfferService.All.Where(x => x.State == Offer.OfferState.Offered).OrderByDescending(x => x.CreationTime).Take(20);

				var feedModel = CreateFeedModel<OfferFeedModel>();
				feedModel.Offers = offersToFeed;
				feedModel.FeedOwnerName = feedSetting.User.DisplayName;

				return View("OfferRss", feedModel);
			}

			return null;
		}

		/// <summary>
		/// Фид для комментариев по истории
		/// </summary>
		/// <param name="id">ИД истории</param>
		/// <returns>RSS с комментариями</returns>
		public ActionResult CommentRss(string id)
		{
			var story = StoryService.ById(id);
			if (story == null)
			{
				return null;
			}

			var feedModel = CreateFeedModel<CommentFeedModel>();
			feedModel.Story = story;

			return View("CommentRss", feedModel);
		}

		protected TModel CreateFeedModel<TModel>()
			where TModel : BaseFeedModel, new()
		{
			var siteName = SettingService[Const.SettingSiteName] as string;
			return new TModel { SiteName = siteName };
		}
	}
}
